/**
 * @file    drv_gpt.c
 * @brief 
 * @author  name
 * @version 1.0.1
 * @date    2023-04-17
 * 
 * @copyright Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date       <th>Version   <th>Author   <th>Description
 * <tr><td>2023-04-17 <td>1.0.1     <td>Liuwei   <td>首次创建
 * </table>
 */
/* includes ------------------------------------------------------------------*/
#include "drv_gpt.h"
#include "mcu_type.h"
/* macro/define --------------------------------------------------------------*/
/* typedef -------------------------------------------------------------------*/
typedef struct gpt_type
{
	TIMER_T * tim_id;
	uint32_t clk_scr;
	uint32_t tim_mode;
	IRQn_Type time_irq;
}gpt_obj_type;

/* local functions -----------------------------------------------------------*/

/* static variables ----------------------------------------------------------*/
/* 通用定时器对象列表 */
static gpt_obj_type gpt_obj_list[DRV_GPT_MAX]=
{
	{ TIMER0 ,CLK_CLKSEL1_TMR0SEL_HIRC , TMR0_MODULE , TMR0_IRQn },
	{ TIMER1 ,CLK_CLKSEL1_TMR1SEL_HIRC , TMR1_MODULE , TMR1_IRQn },
	{ TIMER2 ,CLK_CLKSEL1_TMR2SEL_HIRC , TMR2_MODULE , TMR2_IRQn },
	{ TIMER3 ,CLK_CLKSEL1_TMR3SEL_HIRC , TMR3_MODULE , TMR3_IRQn },
};

/* 通用定时器回调函数 */
static drv_gpt_cb_func gpt_cb_func_list[DRV_GPT_MAX] = 
{
	NULL ,
	NULL ,
	NULL ,
	NULL ,
};

static uint32_t gpt_run_cycle[DRV_GPT_MAX] = 
{
	0 ,
};
/* global variables ----------------------------------------------------------*/

/** ------------------------------------------------------------------------- *
  *                             Global function
 ** ------------------------------------------------------------------------- */
/**
 * @brief  定时器初始化
 * @param  dpt_id : 定时ID
 * @param  cycle : 中断周期 (ms)
 * @param  pfunc : 中断回调函数
 * @return uint8_t 返回初始化状态
 */
uint8_t drv_gpt_init(uint8_t dpt_id, uint32_t cycle , drv_gpt_cb_func pfunc)
{
	
	if((dpt_id >= DRV_GPT_MAX) || (cycle == 0))
		return FALSE;
		          
	CLK_SetModuleClock(gpt_obj_list[dpt_id].tim_mode , gpt_obj_list[dpt_id].clk_scr , 12);
	
	CLK_EnableModuleClock(gpt_obj_list[dpt_id].tim_mode);
	
	TIMER_Open(gpt_obj_list[dpt_id].tim_id , TIMER_PERIODIC_MODE , 1000 / cycle );

	TIMER_EnableInt(gpt_obj_list[dpt_id].tim_id);	

	NVIC_EnableIRQ(gpt_obj_list[dpt_id].time_irq);
		
	TIMER_Start(gpt_obj_list[dpt_id].tim_id);

	gpt_run_cycle[dpt_id] = cycle;
	
	gpt_cb_func_list[dpt_id] = pfunc;
	
	return TRUE;
}

/**
 * @brief  启动定时器
 * @param  dpt_id
 */
void drv_gpt_start(uint8_t dpt_id)
{
	TIMER_Start(gpt_obj_list[dpt_id].tim_id);
	TIMER_ResetCounter(gpt_obj_list[dpt_id].tim_id);
}

/**
 * @brief  停止定时器
 * @param  dpt_id
 */
void drv_gpt_stop(uint8_t dpt_id)
{
	TIMER_Stop(gpt_obj_list[dpt_id].tim_id);
}


/** ------------------------------------------------------------------------- *
  *                              Local function
 ** ------------------------------------------------------------------------- */
/**
 * @brief gpt0中断回调函数
*/
void drv_gpt0_irq(void)
{
	if(gpt_cb_func_list[DRV_GPT0] != NULL)
	{
		gpt_cb_func_list[DRV_GPT0](gpt_run_cycle[DRV_GPT0]);
	}
}

/**
 * @brief gpt1中断回调函数
*/
void drv_gpt1_irq(void)
{
	if(gpt_cb_func_list[DRV_GPT1] != NULL)
	{
		gpt_cb_func_list[DRV_GPT1](gpt_run_cycle[DRV_GPT1]);
	}
}

/**
 * @brief gpt2中断回调函数
*/
void drv_gpt2_irq(void)
{
	if(gpt_cb_func_list[DRV_GPT2] != NULL)
	{
		gpt_cb_func_list[DRV_GPT2](gpt_run_cycle[DRV_GPT2]);
	}
}

/**
 * @brief gpt3中断回调函数
*/
void drv_gpt3_irq(void)
{
	if(gpt_cb_func_list[DRV_GPT3] != NULL)
	{
		gpt_cb_func_list[DRV_GPT3](gpt_run_cycle[DRV_GPT3]);
	}
}
/********** Copyright (c) 2023 JBD-Energy Storage Technology Co. LTD *********/
